#include <type_traits>
#include <iostream>

// 检查类型是否为整型
template<typename T>
using is_integral = std::is_integral<T>;

// 检查类型是否为浮点型
template<typename T>
using is_floating_point = std::is_floating_point<T>;

// 检查类型是否为指针
template<typename T>
using is_pointer = std::is_pointer<T>;

// 示例：使用逻辑操作组合类型traits
template<typename T>
struct MyTypeChecker {
    // 检查类型T是否是整型或者浮点型（至少满足其中一个条件）
    static constexpr bool is_numeric_or_pointer = std::disjunction<is_integral<T>, is_floating_point<T>, is_pointer<T>>::value;

    // 检查类型T是否既是整型又是浮点型（当然这是不可能的，用于示例）
    static constexpr bool is_integral_and_floating = std::conjunction<is_integral<T>, is_floating_point<T>>::value;

    // 检查类型T是否不是指针
    static constexpr bool is_not_pointer = std::negation<is_pointer<T>>::value;
};

int main() {
    // 检查int类型
    std::cout << "int is numeric or pointer: " << MyTypeChecker<int>::is_numeric_or_pointer << std::endl; // 应输出1（true）
    std::cout << "int is integral and floating: " << MyTypeChecker<int>::is_integral_and_floating << std::endl; // 应输出0（false）
    std::cout << "int is not a pointer: " << MyTypeChecker<int>::is_not_pointer << std::endl; // 应输出1（true）

    // 检查float类型
    std::cout << "float is numeric or pointer: " << MyTypeChecker<float>::is_numeric_or_pointer << std::endl; // 应输出1（true）
    std::cout << "float is integral and floating: " << MyTypeChecker<float>::is_integral_and_floating << std::endl; // 应输出0（false）
    std::cout << "float is not a pointer: " << MyTypeChecker<float>::is_not_pointer << std::endl; // 应输出1（true）

    // 检查float*类型（指针类型）
    std::cout << "float* is numeric or pointer: " << MyTypeChecker<float*>::is_numeric_or_pointer << std::endl; // 应输出1（true）
    std::cout << "float* is integral and floating: " << MyTypeChecker<float*>::is_integral_and_floating << std::endl; // 应输出0（false）
    std::cout << "float* is not a pointer: " << MyTypeChecker<float*>::is_not_pointer << std::endl; // 应输出0（false）
}